package com.ff.xyh.consumer.messagedeliver.config;

import com.ff.xyh.common.entity.message.RoomMessage;
import org.springframework.amqp.core.*;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.time.LocalTime;

/**
 * @Auther FF
 * @Date 2022年 11月 30日
 * @Time 01:02
 */

//@Configuration
public class UserRabbitConfig {

    public static final String EXCHANGE_DIRECT_USER_1 = "user.direct.ex1";
    public static final String QUEUE_USER_1 = "user.q1";
    public static final String ROUTING_KEY_USER_ONLINE = "userOnline";
    public static final String ROUTING_KEY_USER_ONLINE2 = "userOnline2";

    /** 创建直接交换机并绑定对列的 方法一 : 通过bean注解声明并绑定 然后在消费者监听队列即可 */
    /** 1
     * 声明用户 直接交换机
     * @return
     */
    @Bean
    public DirectExchange userDirectEx1 () { return new DirectExchange(EXCHANGE_DIRECT_USER_1); }

    /** 2
     * 声明 用户直接交换机将绑定的队列
     * @return
     */
    @Bean
    public Queue userDirectQ1() { return new Queue(QUEUE_USER_1); }

    /** 3
     * 根据路由绑定对列到交换机
     * @param userDirectQ1
     * @param userDirectEx1
     * @return
     */
    @Bean
    public Binding userBinding(Queue userDirectQ1, DirectExchange userDirectEx1) {
        return BindingBuilder.bind(userDirectQ1).to(userDirectEx1).with(ROUTING_KEY_USER_ONLINE);
    }

    /** 4
     * 创建监听器 监听队列
     * @param roomMessage
     */
    @RabbitListener(queues = QUEUE_USER_1)
    public void userOnlineQueueConsumer1(RoomMessage roomMessage) {
        System.out.println("userOnlineQueueConsumer1 listen user.q1 received the message: {" + roomMessage + "}, when " + LocalTime.now());
    }

    /** 方法二： 直接在监听器上声明并绑定 */
//    @RabbitListener(bindings = @QueueBinding(
//            value = @org.springframework.amqp.rabbit.annotation.Queue(name = QUEUE_USER_1),
//            exchange = @org.springframework.amqp.rabbit.annotation.Exchange(name = EXCHANGE_DIRECT_USER_1, type = ExchangeTypes.DIRECT),
//            key = {ROUTING_KEY_USER_ONLINE, ROUTING_KEY_USER_ONLINE2}
//    ))






    /**
     * 添加自定义消息转换器 不需要声明 会自动注入
     * 原有消息转换器为序列化对象，性能差
     * 注意： 发送方与接收方需要使用相同的转换器
     * @return
     */
    @Bean
    public MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }



}